1 module hip.gui.group;
2 import hip.gui.widget;
3 
4 /**
5  * Defines a non rendering widget which is solely used for positioning purposes
6  */
7 class Group : Widget
8 {
9     protected Widget[] renderFlatTree;
10 
11     /** 
12      * If you don't have overlapping sprites, you may flatten the tree for rendering.
13      * This beyond increasing iteration speed since there will be less recursive calls,
14      * it is also possible to sort by batch types.
15      */
16     void flattenRenderTree(scope TypeInfo[] renderOrder...)
17     {
18         import core.memory;
19         if(renderFlatTree !is null)
20             GC.free(renderFlatTree.ptr);
21         Widget[] flattened;
22         static void flattenImpl(ref Widget[] arr, Widget w)
23         {
24             foreach(c; w.children)
25                 flattenImpl(arr, c);
26             arr~= w;
27         }
28         flattenImpl(flattened, this);
29 
30         import hip.util.algorithm;
31         import hip.util.array:array;
32 
33 
34         renderFlatTree = quicksort(flattened, (Widget a, Widget b) @nogc
35         {
36             TypeInfo aI = typeid(a), bI = typeid(b);
37             foreach(v; renderOrder)
38             {
39                 if(bI is v)
40                     return true;
41                 if(aI is v)
42                     return false;
43             }
44             return true;
45         });
46     }
47     
48     override void onRender(){}
49 
50     override final void render()
51     {
52         if(renderFlatTree !is null)
53         {
54             preRender();
55             foreach(ch; renderFlatTree)
56             {
57                 if(ch.visible)
58                 {
59                     ch.preRender();
60                     ch.onRender();
61                 }
62             }
63         }
64         else
65             super.render();
66     }
67 }